import { SessionMessageTypeEnum } from '@/common/constant/service.enum';
import utils from '@/common/utils/session';
import emoji from './emoji';

class Message {
  constructor(obj) {
    this.obj = obj;
    this._init_();
  }

  _init_() {
    if (this.obj) {
      this.id = this.obj.id ?? this.obj.sessionId;
      this.messageId = this.obj.messageId;
      this.sessionId = this.obj.sessionId;
      this.answerType = this.obj.answerType;
      this.agentId = this.obj.agentId;
      this.agentName = this.obj.agentName;
      this.resolveFlag = this.obj.resolveFlag;
      this.comment = this.obj.comment;
      this.reason = this.obj.reason;
      this.customerId = this.obj.customerId;
      this.customerChannelId = this.obj.customerChannelId;
      this.companyId = this.obj.companyId;
      this.messageDirection = this.obj.messageDirection; //C:顾客发给客服；U客服发给顾客，S系统
      this.messageType = this.obj.messageType; //T:文本 I:图片 V:视频 F:文件 S1:系统消息(发送给顾客) S2:系统消息(发送给客服) R:机器人回复消息
      this.messageStatus = this.obj.messageStatus; //-1:发送失败0:发送中10:未读 20:已读 30:离线:40撤回
      this.messageContent = this.obj.messageContent;
      this.messageContentSimple = this.obj.messageContentSimple;
      this.senderId = this.obj.senderId;
      this.robotId = this.obj.robotId;
      this.receiveId = this.obj.receiveId;
      this.senderCode = this.obj.senderCode;
      this.senderNickname = this.obj.senderNickname;
      this.senderAvatar = this.obj.senderAvatar;
      this.sendTime = this.obj.sendTime; //发送时间
      this.recallTime = this.obj.recallTime; //撤回时间
      this.readTime = this.obj.readTime; //已读时间
      this.mediaUrl = this.obj.mediaUrl; //文件路径
      this.solveStatus = (
        typeof this.obj.solveStatus != 'undefined' && this.obj.solveStatus
      ) ? this.obj.solveStatus : (
        typeof this.obj.resolveFlag != 'undefined' && this.obj.resolveFlag
      ) ? (
        this.obj.resolveFlag == 1 ? '2' : this.obj.resolveFlag == 2 ? '3' : '1'
      ) : "1"; //未提交,2已解决3,未解决
      this.robotName = this.obj.robotName; //机器人客服名称
      this.robotAvatar = this.obj.robotAvatar; //机器人客服头像
      // 前端辅助字段
      this.retryCount = this.obj.retryCount;
      this.successCallback = this.obj.successCallback; // 消息发送成功回调函数
      this.failCallback = this.obj.failCallback; // 消息发送失败回调函数
      this.readCallback = this.obj.readCallback; // 消息被接收方已读回调函数
      this.sendFileStatus = this.obj.sendFileStatus == undefined ? 1 : this.obj.sendFileStatus; //0:上传中,1:上传成功，2:上传失败
      this.isOpen = false;
      this.isHasOpen = false;
      this.height = "unset";
      if (this.obj.questionSource && this.obj.questionSource != null && this.obj.questionSource != "") {
        this.questionSource = this.obj.questionSource;
      } else {
        this.questionSource = 0;
      };
      this.fileDocList = this.obj.fileDocList;
      this.fileImgData = this.obj.fileImgData;
    }
  }

  getHtml() {
    switch (this.messageType) {
      case SessionMessageTypeEnum.文本:
      case SessionMessageTypeEnum.机器人回复消息:
        return this.filterIcon(this.messageType, this.messageContent);
    }
  }

  filterIcon(messageType, messageContent) {
    var _this = this;
    var content = messageContent;
    if (messageType == SessionMessageTypeEnum.机器人回复消息 && utils.isObjectJson(messageContent)) {
      content = JSON.parse(messageContent).answer;
    };
    var regexList = [];
    regexList.push({ regex: /<a(.*?)target='[^']*'(.*?)>/gi, value: "<a$1target='_blank '$2>" });
    regexList.push({ regex: /<a(((?!target).)*?)>/gi, value: "<a target='_blank '$1>" });
    regexList.push({ regex: /\n/gi, value: "<br>" });
    regexList.push({ regex: /<img(.*?)onclick='[^']*'(.*?)>/gi, value: "<img $1 onclick='openRobotLinkEvent(this,\"" + "img" + "\") '$2>" });
    regexList.push({ regex: /<img(((?!onclick).)*?)>/gi, value: "<img onclick='openRobotLinkEvent(this,\"" + "img" + "\") '$1>" });
    regexList.push({ regex: /<video(.*?)controls='[^']*'(.*?)>/gi, value: "<video$1 controls $2>" });
    regexList.push({ regex: /<video(((?!controls).)*?)>/gi, value: "<video controls $1>" });
    regexList.push({ regex: /<video(.*?)preload="[^"]*"(.*?)>/gi, value: "<video$1 preload='preload' $2>" });
    regexList.push({ regex: /<video(((?!preload).)*?)>/gi, value: "<video preload='preload' $1>" });
    regexList.push({ regex: /<video(.*?)autoplay='[^']*'(.*?)>/gi, value: "<video$1 $2>" });
    regexList.push({ regex: /<video(.*?)autoplay(.*?)>/gi, value: "<video$1 $2>" });

    // 获取机器人消息体整体宽度
    //（-头像宽度-头像边距）* 气泡百分比 - 气泡内边距
    // const contentDivWidth = ($(".contentDiv").width() - 45 - 7) * 0.9 - 38;
    const contentDivWidth = 285;
    const contentDivWidth2 = ($(".contentDiv2").width() - 58) * 0.75;

    /**
     * 控制宽高
     */
    const videoContentWidth = content.match(/<video(.*?)width="[^"]*"(.*?)>/gi);
    const videoContentHeight = content.match(/<video(.*?)height="[^"]*"(.*?)>/gi);
    let videoWidth = null;
    let videoHeight = null;
    // 获取video的宽高
    const videoEleWidth = videoContentWidth ? videoContentWidth[0].match(/width="[^"]*"/gi) : null;
    const videoEleHeight = videoContentHeight ? videoContentHeight[0].match(/height="[^"]*"/gi) : null;
    if (videoEleWidth && videoEleWidth[0]) {
      videoWidth = videoEleWidth[0].match(/"[^"]*"/gi)[0].split('"')[1];
    };
    if (videoEleHeight && videoEleHeight[0]) {
      videoHeight = videoEleHeight[0].match(/"[^"]*"/gi)[0].split('"')[1];
    };
    // 判断video的宽和气泡的最大宽 若video大于气泡 则取气泡的宽 高等比例展示  若video小于气泡 则取video本身宽高
    const chatDivWidth = contentDivWidth === 0 ? contentDivWidth2 : contentDivWidth;
    if (videoWidth && videoWidth > chatDivWidth) {
      const actualHeight = videoHeight * (chatDivWidth / videoWidth);
      regexList.push({ regex: /<video(.*?)width="[^"]*"(.*?)>/gi, value: "<video$1 width='" + chatDivWidth + "' $2>" });
      regexList.push({ regex: /<video(.*?)height="[^"]*"(.*?)>/gi, value: "<video$1 height='" + actualHeight + "' $2>" });
    };
    for (var i = 0; i < regexList.length; i++) {
      content = content.replace(regexList[i].regex, regexList[i].value);
    };
    return emoji.emoji_img(content);
  }

  showType() {
    if (this.messageType === SessionMessageTypeEnum.机器人回复消息 && utils.isObjectJson(this.messageContent)) {
      const data = JSON.parse(this.messageContent);
      if (data.choices.length > 0 || data.suggestions.length > 0) {
        // 有选项消息
        return true;
      }
    };
    if (this.messageType === SessionMessageTypeEnum.Z && JSON.parse(this.messageContent).length > 0) {
      return true;
    };
    // if (this.messageType === SessionMessageTypeEnum.图片 || this.messageType === SessionMessageTypeEnum.视频 || this.messageType === SessionMessageTypeEnum.文件) {
    if ([SessionMessageTypeEnum.图片, SessionMessageTypeEnum.视频, SessionMessageTypeEnum.文件].includes(this.messageType)) {
      return true;
    };
    return false;
  }
}

// const Message = function (obj) {
//   this._init_(obj);
// };

// Message.prototype = {
//   constructor: Message,
//   _init_: function (obj) {
//     if (obj) {
//       this.id = obj.id;
//       this.messageId = obj.messageId;
//       this.sessionId = obj.sessionId;
//       this.customerId = obj.customerId;
//       this.customerChannelId = obj.customerChannelId;
//       this.companyId = obj.companyId;
//       this.messageDirection = obj.messageDirection; //C:顾客发给客服；U客服发给顾客，S系统
//       this.messageType = obj.messageType; //T:文本 I:图片 V:视频 F:文件 S1:系统消息(发送给顾客) S2:系统消息(发送给客服) R:机器人回复消息
//       this.messageStatus = obj.messageStatus; //-1:发送失败0:发送中10:未读 20:已读 30:离线:40撤回
//       this.messageContent = obj.messageContent;
//       this.messageContentSimple = obj.messageContentSimple;
//       this.senderId = obj.senderId;
//       this.robotId = obj.robotId;
//       this.receiveId = obj.receiveId;
//       this.senderCode = obj.senderCode;
//       this.senderNickname = obj.senderNickname;
//       this.senderAvatar = obj.senderAvatar;
//       this.sendTime = obj.sendTime; //发送时间
//       this.recallTime = obj.recallTime; //撤回时间
//       this.readTime = obj.readTime; //已读时间
//       this.mediaUrl = obj.mediaUrl; //文件路径
//       this.solveStatus = (
//         typeof obj.solveStatus != 'undefined' && obj.solveStatus
//       ) ? obj.solveStatus : (
//         typeof obj.resolveFlag != 'undefined' && obj.resolveFlag
//       ) ? (
//         obj.resolveFlag == 1 ? '2' : obj.resolveFlag == 2 ? '3' : '1'
//       ) : "1"; //未提交,2已解决3,未解决
//       this.robotName = obj.robotName; //机器人客服名称
//       this.robotAvatar = obj.robotAvatar; //机器人客服头像
//       // 前端辅助字段
//       this.retryCount = obj.retryCount;
//       this.successCallback = obj.successCallback; // 消息发送成功回调函数
//       this.failCallback = obj.failCallback; // 消息发送失败回调函数
//       this.readCallback = obj.readCallback; // 消息被接收方已读回调函数
//       this.sendFileStatus = obj.sendFileStatus == undefined ? 1 : obj.sendFileStatus; //0:上传中,1:上传成功，2:上传失败
//       this.isOpen = false;
//       this.isHasOpen = false;
//       this.height = "unset";
//       if (obj.questionSource && obj.questionSource != null && obj.questionSource != "") {
//         this.questionSource = obj.questionSource;
//       } else {
//         this.questionSource = 0;
//       };
//       this.fileDocList = obj.fileDocList;
//       this.fileImgData = obj.fileImgData;
//     }
//   },

//   showType: function () {
//     var _this = this;
//     if (_this.messageType == MessageType.R && _this.isJSON(_this.messageContent)) {
//       var data = JSON.parse(_this.messageContent);
//       if (data.choices.length > 0 || data.suggestions.length > 0) {
//         // 有选项消息
//         return true;
//       }
//     };
//     if (_this.messageType == MessageType.Z && JSON.parse(_this.messageContent).length > 0) {
//       return true;
//     };
//     if (_this.messageType == MessageType.I || _this.messageType == MessageType.V || _this.messageType == MessageType.F) {
//       return true;
//     };
//     return false;
//   },
//   getHtml: function () {
//     var _this = this;
//     switch (this.messageType) {
//       case MessageType.T:
//       case MessageType.R:
//         return _this.filterIcon(this.messageType, _this.messageContent);
//     }
//   },
//   filterIcon: function (messageType, messageContent) {
//     var _this = this;
//     var content = messageContent;
//     if (messageType == MessageType.R && _this.isJSON(messageContent)) {
//       content = JSON.parse(messageContent).answer;
//     };
//     var regexList = [];
//     regexList.push({ regex: /<a(.*?)target='[^']*'(.*?)>/gi, value: "<a$1target='_blank '$2>" });
//     regexList.push({ regex: /<a(((?!target).)*?)>/gi, value: "<a target='_blank '$1>" });
//     regexList.push({ regex: /\n/gi, value: "<br>" });

//     //获取机器人消息体整体宽度
//     // let contentDivWidth = $(".contentDiv").width() * 0.75;
//     //（-头像宽度-头像边距）* 气泡百分比 - 气泡内边距
//     let contentDivWidth = ($(".contentDiv").width() - 45 - 7) * 0.9 - 38;
//     let contentDivWidth2 = ($(".contentDiv2").width() - 58) * 0.75;
//     if (commonDataClass.chatTerminal == "WEB") {
//       if (commonDataClass.set.windowSize == 1) {
//         contentDivWidth = 450;
//       };
//       if (commonDataClass.set.windowSize == 2) {
//         contentDivWidth = 285;
//       };
//       if (commonDataClass.set.windowSize == 3) {
//         contentDivWidth = 450
//       };
//     };


//     if (commonDataClass.chatTerminal == "WEB" || common.isIOS() || common.isWx()) {
//       if (commonDataClass.chatTerminal == "WEB") {
//         regexList.push({ regex: /<img(.*?)onclick='[^']*'(.*?)>/gi, value: "<img $1 onclick='openRobotLinkEvent(this,\"" + "img" + "\") '$2>" });
//         regexList.push({ regex: /<img(((?!onclick).)*?)>/gi, value: "<img onclick='openRobotLinkEvent(this,\"" + "img" + "\") '$1>" });
//       };
//       // regexList.push({ regex: /<video(((?!poster).)*?)>/ig, value: "<video poster='"+config.fileUrl+defaultImage.videoPoster+"'$1>" })
//       // regexList.push({ regex: /<video(.*?)onclick='[^']*'(.*?)>/ig, value: "<video $1 onclick='openRobotLinkEvent(this,\""+"video"+"\") '$2>" })
//       // regexList.push({ regex: /<video(((?!onclick).)*?)>/ig, value: "<video onclick='openRobotLinkEvent(this,\""+"video"+"\") '$1>" })
//       //
//       // regexList.push({ regex: /<video(.*?)controls='[^']*'(.*?)>/ig, value: "<video$1  $2>" })
//       // regexList.push({ regex: /<video(.*?)controls(.*?)>/ig, value: "<video$1 $2>" })
//       // regexList.push({ regex: /<video(.*?)preload='[^']*'(.*?)>/ig, value: "<video$1  $2>" })
//       // regexList.push({ regex: /<video(.*?)preload(.*?)>/ig, value: "<video$1 $2>" })
//       regexList.push({ regex: /<video(.*?)controls='[^']*'(.*?)>/gi, value: "<video$1 controls $2>" });
//       regexList.push({ regex: /<video(((?!controls).)*?)>/gi, value: "<video controls $1>" });
//       regexList.push({ regex: /<video(.*?)preload="[^"]*"(.*?)>/gi, value: "<video$1 preload='preload' $2>" });
//       regexList.push({ regex: /<video(((?!preload).)*?)>/gi, value: "<video preload='preload' $1>" });
//       regexList.push({ regex: /<video(.*?)autoplay='[^']*'(.*?)>/gi, value: "<video$1 $2>" });
//       regexList.push({ regex: /<video(.*?)autoplay(.*?)>/gi, value: "<video$1 $2>" });
//     } else {
//       // regexList.push({ regex: /<video(.*?)controls='[^']*'(.*?)>/ig, value: "<video$1 controls $2>" })
//       regexList.push({ regex: /<video(.*?)controls='[^']*'(.*?)>/gi, value: "<video$1 controls $2>" });
//       regexList.push({ regex: /<video(((?!controls).)*?)>/gi, value: "<video controls $1>" });
//       regexList.push({ regex: /<video(.*?)preload="[^"]*'(.*?)>/gi, value: "<video$1 preload='preload' $2>" });
//       regexList.push({ regex: /<video(((?!preload).)*?)>/gi, value: "<video preload='preload' $1>" });
//       regexList.push({ regex: /<video(.*?)autoplay='[^']*'(.*?)>/gi, value: "<video$1 $2>" });
//       regexList.push({ regex: /<video(.*?)autoplay(.*?)>/gi, value: "<video$1 $2>" });
//     };
//     /**
//      * 控制宽高
//      */
//     const videoContentWidth = content.match(/<video(.*?)width="[^"]*"(.*?)>/gi);
//     const videoContentHeight = content.match(/<video(.*?)height="[^"]*"(.*?)>/gi);
//     let videoWidth = null;
//     let videoHeight = null;
//     //获取video的宽高
//     const videoEleWidth = videoContentWidth ? videoContentWidth[0].match(/width="[^"]*"/gi) : null;
//     const videoEleHeight = videoContentHeight ? videoContentHeight[0].match(/height="[^"]*"/gi) : null;
//     if (videoEleWidth && videoEleWidth[0]) {
//       videoWidth = videoEleWidth[0].match(/"[^"]*"/gi)[0].split('"')[1];
//     };
//     if (videoEleHeight && videoEleHeight[0]) {
//       videoHeight = videoEleHeight[0].match(/"[^"]*"/gi)[0].split('"')[1];
//     };
//     //判断video的宽和气泡的最大宽 若video大于气泡 则取气泡的宽 高等比例展示  若video小于气泡 则取video本身宽高
//     let chatDivWidth = contentDivWidth === 0 ? contentDivWidth2 : contentDivWidth;
//     if (videoWidth && videoWidth > chatDivWidth) {
//       const actualHeight = videoHeight * (chatDivWidth / videoWidth);
//       regexList.push({ regex: /<video(.*?)width="[^"]*"(.*?)>/gi, value: "<video$1 width='" + chatDivWidth + "' $2>" });
//       regexList.push({ regex: /<video(.*?)height="[^"]*"(.*?)>/gi, value: "<video$1 height='" + actualHeight + "' $2>" });
//     };
//     for (var i = 0; i < regexList.length; i++) {
//       content = content.replace(regexList[i].regex, regexList[i].value);
//     };
//     return emoji.emoji_img(content);
//   },
//   getSystemHtml: function (sessionIdNow, flag) {
//     var keyWordList = [];
//     var messageContent = this.messageContent;
//     if (messageContent.indexOf("#留言#") > -1) {
//       keyWordList.push("#留言#");
//     };
//     if (messageContent.indexOf("#重新接入#") > -1) {
//       keyWordList.push("#重新接入#");
//     };
//     if (messageContent.indexOf("#人数#") > -1) {
//       keyWordList.push("#人数#");
//     };
//     if (messageContent.indexOf("#客服名称#") > -1) {
//       keyWordList.push("#客服名称#");
//     };
//     for (var i = 0; i < keyWordList.length; i++) {
//       if (keyWordList[i] == "#重新接入#") {
//         if (sessionIdNow == null) {
//           var keyHtml =
//             "<a onclick=\"initClickEvent('" +
//             keyWordList[i] +
//             '\')"  style="color: #ffffff;background:#FFB63D;padding:2px 5px;cursor: pointer;border-radius: 25px;white-space: nowrap">' +
//             keyWordList[i] +
//             "</a>";
//           messageContent = messageContent.replace(keyWordList[i], keyHtml);
//         }
//       };
//       if (keyWordList[i] == "#留言#") {
//         var keyHtml =
//           "<a onclick=\"initClickEvent('" +
//           keyWordList[i] +
//           '\')" style="color: #ffffff;background:#FFB63D;padding:2px 5px;cursor: pointer;border-radius: 25px;white-space: nowrap">' +
//           keyWordList[i] +
//           "</a>";
//         messageContent = messageContent.replace(keyWordList[i], keyHtml);
//       };
//       if (keyWordList[i] != "#重新接入#" && keyWordList[i] != "#留言#") {
//         if (sessionIdNow != null && flag) {
//           var keyHtml =
//             "<a onclick=\"initClickEvent('" +
//             keyWordList[i] +
//             '\')"  style="color: #ffffff;background:#FFB63D;padding:2px 5px;cursor: pointer;border-radius: 25px;white-space: nowrap">' +
//             keyWordList[i] +
//             "</a>";
//           messageContent = messageContent.replace(keyWordList[i], keyHtml);
//         }
//       }
//     };
//     return messageContent;
//   },
//   getSendTime: function () {
//     const _this = this;
//     const sendTime = moment(this.sendTime).format("HH:mm:ss");
//     if (_this.messageType == 'R') {
//       //1.欢迎语需要展示时间
//       if (_this.isJSON(_this.messageContent) && JSON.parse(_this.messageContent).mainQuestion == 'qizhi_welcome') {
//         _this.lastChatTimeShow = _this.sendTime;
//       }
//     };
//     if (_this.messageDirection == 'S' && _this.messageType != 'S2') {
//       //2.超时回复和超时关闭需要展示时间
//       // _this.lastChatTimeShow =_this.sendTime;
//       return sendTime;
//     };
//     let lastChatTimeShow = ''
//     for (let i = commonDataClass.chatRoom.messages.length - 1; i > -1; i--) {
//       const m = commonDataClass.chatRoom.messages[i]
//       if (m.lastChatTimeShow) {
//         lastChatTimeShow = m.lastChatTimeShow;
//         break;
//       }
//     };
//     if (_this.messageDirection == 'C') {
//       const diffMin = moment(_this.sendTime).diff(moment(lastChatTimeShow), 'minute');
//       if (diffMin > 0) {
//         _this.lastChatTimeShow = _this.sendTime
//       }
//     };
//   },
//   renderTime: function () {
//     const sendTime = moment(this.sendTime * 1).format("YYYY-MM-DD");
//     const momentTime = moment().format("YYYY-MM-DD");
//     if (moment(sendTime).isBefore(momentTime) && this.messageDirection == 'C') {
//       return moment(this.sendTime * 1).format("YYYY-MM-DD HH:mm:ss");
//     };
//     return this.lastChatTimeShow ? moment(this.lastChatTimeShow).format("HH:mm:ss") : ''
//   },
//   isJSON: function (str) {
//     if (typeof str == "string") {
//       try {
//         var obj = JSON.parse(str);
//         if (typeof obj == "object" && obj) {
//           return true;
//         } else {
//           return false;
//         }
//       } catch (e) {
//         return false;
//       }
//     }
//     return false;
//   },
//   toString: function () {
//     return JSON.stringify(this);
//   }
// };

export default Message;
